#include <iostream>
#include <string>
#include <vector>
#include <chrono>
#include <sw/redis++/redis++.h> 
#include "util.hpp"

void test1(sw::redis::Redis &redis)
{
    std::cout << "zadd And zrange 的使用" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 99);
    redis.zadd("key", {
        std::make_pair("赵云", 77),
        std::make_pair("赵云", 88),
        std::make_pair("张飞", 99)
    });

    std::vector<std::string> members;
    auto it = std::back_inserter(members);
    redis.zrange("key", 0, -1, it);
    printContainer(members);

    std::vector<std::pair<std::string, double>> membersWithScore;
    auto it2 = std::back_inserter(membersWithScore);
    redis.zrange("key", 0, -1, it2);
    printContainerPair(membersWithScore);
}

void test2(sw::redis::Redis &redis)
{
    std::cout << "zcard 的使用" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 99);
    redis.zadd("key", {
        std::make_pair("赵云", 77),
        std::make_pair("赵云", 88),
        std::make_pair("张飞", 99)
    });

    long long result = redis.zcard("key");
    std::cout << "result: " << result << std::endl;
}

void test3(sw::redis::Redis &redis)
{
    std::cout << "zrem 的使用" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 99);
    redis.zadd("key", {
        std::make_pair("赵云", 77),
        std::make_pair("赵云", 88),
        std::make_pair("张飞", 99)
    });

    long long result = redis.zrem("key", "张飞");
    std::cout << "result: " << result << std::endl;
}

void test4(sw::redis::Redis &redis)
{
    std::cout << "zscore 的使用" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 99);
    redis.zadd("key", {
        std::make_pair("赵云", 77),
        std::make_pair("赵云", 88),
        std::make_pair("张飞", 99)
    });

    auto score = redis.zscore("key", "张飞");
    if(score) {
        std::cout << "score: " << score.value() << std::endl;
    } else {
        std::cout << "score 无效" << std::endl;
    }
}

void test5(sw::redis::Redis &redis)
{
    std::cout << "zrank 的使用" << std::endl;
    redis.flushall();

    redis.zadd("key", "吕布", 99);
    redis.zadd("key", {
        std::make_pair("赵云", 77),
        std::make_pair("赵云", 88),
        std::make_pair("张飞", 99)
    });

    auto rank = redis.zrank("key", "张飞");
    if(rank) {
        std::cout << "rank: " << rank.value() << std::endl;
    } else {
        std::cout << "rank 无效" << std::endl;
    }
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);

    return 0;
}